package com.eber.demo.design.state.b;

public class Lift implements ILift {
    private int state;

    @Override
    public void setState(int state) {
        this.state = state;
    }

    // 电梯门关闭
    @Override
    public void close() {
        // 电梯在什么状态下可以关闭
        switch (this.state) {
            case OPENING_STATE: // 可以关闭, 同时修改电梯状态
                this.closeWithoutLogic();
                this.setState(CLOSING_STATE);
                break;
            case CLOSING_STATE: // 电梯关闭状态，则什么都不做
                // do nothing
                break;
            case RUNNING_STATE: // 电梯运行状态，门本来就是关闭的
                // do nothing
                break;
            case STOPPING_STATE: // 停止状态，门也是关闭的，则什么都不做
                // do nothing
                break;
        }
    }

    // 电梯门开启
    @Override
    public void open() {
        // 电梯在什么状态下可以开启
        switch (this.state) {
            case OPENING_STATE: // 敞门状态，什么也不做
                // do nothing
                break;
            case CLOSING_STATE: // 闭门状态，则可以开启
                this.openWithoutLogic();
                this.setState(OPENING_STATE);
                break;
            case RUNNING_STATE: // 电梯运行状态，不能开门
                // do nothing
                break;
            case STOPPING_STATE: // 停止状态，开门
                this.openWithoutLogic();
                this.setState(OPENING_STATE);
                break;
        }
    }

    // 电梯开始运行起来
    @Override
    public void run() {
        // 电梯在什么状态下可以运行
        switch (this.state) {
            case OPENING_STATE: // 敞门状态，什么也不做
                // do nothing
                break;
            case CLOSING_STATE: // 闭门状态，则可以运行
                this.runWithoutLogic();
                this.setState(RUNNING_STATE);
                break;
            case RUNNING_STATE: // 电梯运行状态，什么也不做
                // do nothing
                break;
            case STOPPING_STATE: // 停止状态，可以运行
                this.runWithoutLogic();
                this.setState(RUNNING_STATE);
                break;
        }
    }

    // 电梯停止
    @Override
    public void stop() {
        // 电梯在什么状态下可以运行
        switch (this.state) {
            case OPENING_STATE: // 敞门状态，什么也不做
                // do nothing
                break;
            case CLOSING_STATE: // 闭门状态，则可以停止
                this.stopWithoutLogic();
                this.setState(STOPPING_STATE);
                break;
            case RUNNING_STATE: // 电梯运行状态，可以停止
                this.stopWithoutLogic();
                this.setState(STOPPING_STATE);
                break;
            case STOPPING_STATE: // 停止状态，什么也不做
                // do nothing
                break;
        }
    }

    // 纯粹的电梯关闭，不考虑实际的逻辑
    private void closeWithoutLogic() {
        System.out.println("电梯门关闭...");
    }

    // 电梯门开启
    public void openWithoutLogic() {
        System.out.println("电梯门开启...");
    }

    // 电梯开始运行起来
    public void runWithoutLogic() {
        System.out.println("电梯上下运行起来...");
    }

    // 电梯停止
    public void stopWithoutLogic() {
        System.out.println("电梯停止了...");
    }
}
